package br.usp.ime.ingpos.modelo.dao;

import java.util.List;

import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.util.hibernate.SessionCreator;
import br.usp.ime.ingpos.modelo.Candidato;
import br.usp.ime.ingpos.modelo.Inscricao;
import br.usp.ime.ingpos.modelo.ProcessoSeletivo;

@Component
@RequestScoped
public class InscricaoDAO
    extends
        AbstractDaoImpl<Long,Inscricao>
{

    public InscricaoDAO(
        SessionCreator sessionCreator )
    {
        super( sessionCreator );
    }

    public void atualizarInscricao(
        Inscricao inscricao )
    {
        saveOrUpdate( inscricao );
    }

    public void removeInscricao(
        Inscricao inscricao )
    {
        delete( inscricao );
    }

    public Inscricao procurarPorCandidatoEProcessoSeletivo(
        final Candidato candidato,
        final ProcessoSeletivo processoSeletivo )
    {
        List<Inscricao> inscricoes = findByCriteria( Restrictions.and(
            Restrictions.eq( "candidato", candidato ),
            Restrictions.eq( "processoSeletivo", processoSeletivo ) ) );

        if( inscricoes.size() == 0 )
            return null;
        return inscricoes.get( 0 );
    }

    public List<Inscricao> procurarProcessoSeletivo(
        final ProcessoSeletivo processoSeletivo )
    {
        List<Inscricao> inscricoes = findByCriteria( Order.desc( "aprovado" ), Restrictions.eq( "processoSeletivo",
            processoSeletivo ) );

        if( inscricoes.size() == 0 )
            return null;
        return inscricoes;
    }
    
    public Inscricao procurarPorCandidato(final Candidato candidato){
        List<Inscricao> inscricao = findByCriteria( Restrictions.eq( "candidato", candidato) );
        
        if( inscricao.isEmpty() )
            return null;

        return inscricao.get( 0 );
    }

    public List<Inscricao> procurarPorCandidatosAprovadosNoProcesso(
        ProcessoSeletivo processoSeletivo )
    {
        List<Inscricao> inscricoes = findByCriteria(Restrictions.and( Restrictions.eq( "processoSeletivo", processoSeletivo ), Restrictions.eq( "aprovado", true )));
        if( inscricoes.size() == 0 )
            return null;
        return inscricoes;
    }

    public List<Inscricao> procurarPorCandidatosReprovadosNoProcesso(
        ProcessoSeletivo processoSeletivo )
    {
        List<Inscricao> inscricoes = findByCriteria(Restrictions.and( Restrictions.eq( "processoSeletivo", processoSeletivo ), Restrictions.eq( "aprovado", false )));
        if( inscricoes.size() == 0 )
            return null;
        return inscricoes;
    }
}
